package com.feihong.txgw.inter.retrofit_api;

import com.feihong.txgw.http.HttpTools;
import com.feihong.txgw.json.HomeJSON;
import com.feihong.txgw.json.goodsCart.GoodsCartParser;
import com.feihong.txgw.json.goodsCart.TerminalListParser;
import com.feihong.txgw.json.kaika.ICCIDList;
import com.feihong.txgw.json.kaika.Menu;
import com.feihong.txgw.json.kaika.PhoneNumList;
import com.feihong.txgw.json.pay.JiFenParser;
import com.feihong.txgw.json.recharge.PhoneLocationInfo;
import com.feihong.txgw.json.user.AllOrderInfo;
import com.feihong.txgw.message.RefreshMsgIconMessage;
import com.feihong.txgw.model.bean.home.HomeDialogShowModel;
import com.feihong.txgw.model.bean.integral.IntegralBackEntity;
import com.feihong.txgw.model.bean.nearby.NearbyModel;
import com.feihong.txgw.model.bean.searchList.SearchPhoneListModel;
import com.feihong.txgw.model.bean.suggest.Suggestmodel;
import com.feihong.txgw.model.base_bean.BaseResponse;
import com.feihong.txgw.model.bean.invitefriend.InviteFriendsResponseEntity;
import com.feihong.txgw.model.bean.llcx.PhoneCardLocation;
import com.feihong.txgw.model.bean.user.HotSearchDataModel;
import com.feihong.txgw.model.bean.user.SortModel;
import com.feihong.txgw.utils.sign.SignToken;

import java.util.Map;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.Request;
import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
import retrofit2.http.Path;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;

/**
 * @Author wangziheng
 * @ProjectName txgw_app
 * @ClassName IRetrofitService
 * @package com.feihong.txgw.inter.listener.retrofit_api
 * @data 2018/5/2 11:02
 * @Describe
 * @Change
 */
public interface IRetrofitService {

    /**
     * 获取终端商品列表
     * @param pageSize
     * @param storeID
     * @param pageNum
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.GET_TERMINAL_GOODS)
    Observable<TerminalListParser> getShopCarRecommedGoods(@Field("pagesize") String pageSize, @Field("store_id") String storeID, @Field("p") String pageNum);

    /**
     * 同步购物车商品到服务端
     * @param mParams
     * @return
     */
    @POST(HttpTools.SYN_SHOPCAR_GOODS_TO_SERVICE)
    Observable<GoodsCartParser> editShopCarGoodsToService(@QueryMap Map<String,String> mParams);

    /**
     * 刷新token
     * @return
     */
    @POST(HttpTools.REFRESH_TOKEN_URL)
    Call<String> refreshToken(@QueryMap Map<String,String> mParams);

    /**
     * 获取首页数据
     * @param cityCode
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.GET_HOME_DATA)
    Observable<HomeJSON> getHomeData(@Field("citycode") String cityCode);

    /**
     * 获取首页推荐广告信息
     * @return
     */
    @POST(HttpTools.GET_HOME_AD_INFO)
    Observable<HomeDialogShowModel> getHomeRecommendMsg(@QueryMap Map<String,String> mParams);

    /**
     * 获取未读消息数量
     * @return
     */
    @POST(HttpTools.UNREAD_MSG_COUNT)
    Observable<RefreshMsgIconMessage> getHomeUnReadMsgCount(@QueryMap Map<String,String> mParams);

    /**
     * 积分待返、积分明细
     *
     * @param type    1 积分明细  2 积分待返
     * @param pageNum
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.GET_INTEGRAL_INFO)
    Observable<IntegralBackEntity> getIntegralData(@Field("type") String type, @Field("page_num") String pageNum);

    /**
     * @param type 2  邀请好友  暂时只有2
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.INVITE_FRIENDS)
    Observable<InviteFriendsResponseEntity> getInviteFriendData(@Field("type") String type);

    /**
     * 开卡大厅 获取开卡类型
     * @param cityCode 根据当前城市选择相应的开卡类型
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.GET_KAIKA_TYPE)
    Observable<String> getKaikaType(@Field("city_code") String cityCode);

    /**
     * 验证iccid  or  获取iccid列表
     * @param iccid
     * @param orderSn
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.VALIDATA_ICCID)
    Observable<ICCIDList> valiDataICCID(@Field("iccid") String iccid, @Field("order_sn") String orderSn);

    /**
     * 获取用户输入iccid的方式
     * @return
     */
    @POST(HttpTools.INPUT_ICCID_TYPE)
    Observable<String> getQueryICCIDType(@QueryMap Map<String,String> mParams);

    /**
     * 开卡 根据iccid 获取对应的手机号码条件菜单
     * @param iccid
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.GET_KAIKA_PHONENUM_MENU)
    Observable<Menu> getKaikaPhoneNumMenu(@Field("iccid") String iccid);

    /**
     * 开卡 获取相应的手机号码列表
     * @return
     */
    @POST(HttpTools.GET_KAIKA_PHONENUM_LIST)
    Observable<PhoneNumList> getKaikaPhoneNumList(@QueryMap Map<String, String> params);

    /**
     * 开卡 提交预支付订单
     * @param params
     * @return
     */
    @POST(HttpTools.UPLOAD_IDCARD_IMG_SUBMIT_YUYUE_ORDER)
    Observable<String> kaikaSubmitYuyueOrder(@QueryMap Map<String, String> params);

    /**
     * 开卡  身份证照片比对认证
     * @param json
     * @return
     */
    @POST(HttpTools.KAIKA_AUTO_IDCARD)
    Observable<String> kaikaAutoIDCard(@QueryMap Map<String,String> json);

    /**
     * 开卡 上传身份证照片
     * @param file
     * @return
     */
    @Multipart
    @POST(HttpTools.KAIKA_UPLOAD_IDCARD_IMG)
    Observable<String> kaikaUploadIDCardImg(@Part MultipartBody.Part file);

    /**
     * 支付   获取积分信息
     *
     * @param orderSn
     * @param orderType
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.GET_ORDER_JIFEN_INFO)
    Observable<JiFenParser> getOrderJifenInfo(@Field("order_sn") String orderSn, @Field("order_type") String orderType);


    /**
     * 生成微信预支付订单
     *
     * @param orderSn
     * @param orderMoney
     * @param orderBody
     * @param handleNotify
     * @param usePoint
     * @param orderType
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.CREATE_WECHAR_PAY_ORDER)
    Observable<String> createWechatPayOrder(@Field("order_sn") String orderSn, @Field("order_money") String orderMoney,
                                            @Field("order_body") String orderBody, @Field("handle_notify") String handleNotify,
                                            @Field("use_point") String usePoint, @Field("order_type") String orderType);

    /**
     * 附近门店 全部门店
     *
     * @param urlType
     * @param mParams
     * @return
     */
    @POST(HttpTools.MENDIAN_URL)
    Observable<NearbyModel> getMenDianInfo(@Path("type") String urlType, @QueryMap Map<String, String> mParams);

    /**
     * 获取订单列表
     *
     * @param pageSize
     * @param pageNum
     * @param status
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.GET_ORDER_LIST_INFO)
    Observable<AllOrderInfo> getOrderInfo(@Field("page_size") String pageSize, @Field("page_num") String pageNum, @Field("status") String status);

    /**
     * 话费、流量充值
     * @param rechaRgeType
     * @param rechargeTel
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.RECHARGE_PHONE)
    Observable<PhoneLocationInfo> getTelOperators(@Field("recharge_type") String rechaRgeType, @Field("phone_num") String rechargeTel);

    /**
     * 话费、流量充值订单提交
     *
     * @param rechargeType 充值类型
     * @param tel
     * @param terminalType 终端类型
     * @param goodsID
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.SUBMIT_RECHARGE_ORDER)
    Observable<String> submitRechargeOrder(@Field("table_id") String rechargeType, @Field("phone_no") String tel,
                                           @Field("terminal_type") String terminalType, @Field("goods_id") String goodsID);

    /**
     * 提交预约订单
     *
     * @param specID
     * @param phoneNum
     * @param adrID
     * @param deliveryType
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.SUBMIT_YUYUE_ORDER)
    Observable<String> submitSubscribeKaikaOrder(@Field("spec_id") String specID, @Field("phonenum") String phoneNum,
                                                 @Field("addr_id") String adrID, @Field("delivery_type") String deliveryType);

    /**
     * 获取终端订单详情
     * @param tableID
     * @param orderID
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.GET_TERMINAL_ORDER_DETAIL)
    Observable<String> getTerminalOrderInfo(@Field("table_id") String tableID, @Field("order_id") String orderID);

    /**
     * 提交评论
     *
     * @param orderSn      订单号
     * @param type         订单类型
     * @param deliveryRand 物流评级
     * @param serviceRand  服务评级
     * @param goodsInfo    评价商品信息  sku_id 商品id  goods_rand 商品评级  comment 评论内容   is_anonymous  是否匿名
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.SUBMIT_REVIEW)
    Observable<String> submitOrderReview(@Field("order_sn") String orderSn, @Field("type") String type,
                                         @Field("delivery_rand") String deliveryRand, @Field("service_rand") String serviceRand,
                                         @Field("goods_info") String goodsInfo);

    /**
     * 提交终端手机订单
     * @param mParams
     * @return
     */
    @POST(HttpTools.SUBMIT_TERMINAL_ORDER)
    Observable<String> submitTerminalOrder(@QueryMap Map<String,String> mParams);

    /**
     * 退出登录
     * @return
     */
    @POST(HttpTools.LOG_OUT)
    Observable<String> logOut(@QueryMap Map<String,String> mParams);

    /**
     * 意见反馈
     *
     * @param suggestContent
     * @param link           联系方式
     * @param source         消息来源  ps: android  ios  小程序
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.SUBMIT_SUGGEST)
    Observable<Suggestmodel> submitSuggest(@Field("content") String suggestContent, @Field("link") String link, @Field("source") String source);

    /**
     * 验证手机号类型
     *
     * @param phoneNum
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.VERTIFY_TEL_TYPE)
    Observable<PhoneCardLocation> vertifyTelType(@Field("phone_num") String phoneNum);

    /**
     * 获取手机套餐信息
     *
     * @param icpID  运营商id
     * @param telNum 手机号
     * @param code   手机验证码  第一次为null  如果服务端有缓存或者手机号为新疆联通 也会有数据返回
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.GET_TEL_PACKAGE_INFO)
    Observable<String> getTelSpaceInfo(@Field("icp_id") String icpID, @Field("phone_num") String telNum, @Field("pass") String code);

    /**
     * 获取验证码
     *
     * @param icpID
     * @param phoneNum
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.SEND_VERTIRY_CODE)
    Observable<String> sendVertiryCode(@Field("icp_id") String icpID, @Field("phone_num") String phoneNum);

    /**
     * 获取城市列表
     *
     * @return
     */
    @POST(HttpTools.GET_CITY_LIST)
    Observable<SortModel> getAllCityInfoToLocation(@QueryMap Map<String,String> mParams);

    /**
     * 上传城市的点击选择量
     *
     * @param regionID
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.COUNT_SELECT_CITY_HIT)
    Observable<String> countCityHits(@Field("region_id") String regionID);

    /**
     * 登陆/修改手机获取验证码
     *
     * @param telNum
     * @param type   0 号码修改
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.SEND_VERTIRY_CODE_LOGIN)
    Observable<String> sendTelCodeToLogin(@Field("phone") String telNum, @Field("type") String type);

    /**
     * 用户登录
     * @param telNum
     * @param code
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.LOGIN)
    Observable<String> userLogin(@Field("mobile") String telNum, @Field("code") String code);

    /**
     * 获取收货地址
     * @return
     */
    @POST(HttpTools.GET_DELIVERY_ADR_LIST)
    Observable<String> getUserDeliveryAdr();

    /**
     * 删除收货地址/编辑修改收货地址/新增收获地址
     *   del_address   addr_id
     * @return
     */
    @POST(HttpTools.EDIT_DELIVERY)
    Observable<BaseResponse> editUserDeliveryAdr(@Path("type") String pathType,@QueryMap Map<String,String> mParams);

    /**
     * 上传用户头像
     *
     * @param file
     * @return
     */
    @Multipart
    @POST(HttpTools.UPLOAD_USER_HEAD_IMG)
    Observable<String> upLoadUserImg(@Part MultipartBody.Part file);

    /**
     * 修改用户信息
     * @param mParams
     * @return
     */
    @POST(HttpTools.EDIT_USER_INFO)
    Observable<String> editUserNickName(@QueryMap Map<String, String> mParams);
    /**
     * 获取热搜商品列表
     *
     * @return
     */
    @POST(HttpTools.GET_HOT_SERACH_GOODS)
    Observable<HotSearchDataModel> getHotSearchGoods(@QueryMap Map<String,String> mParams);

    /**
     * 搜索  商品或门店列表
     *
     * @return 经纬度   关键字  搜索类型  页数
     */
    @POST(HttpTools.SERACH_GOODS_STORE)
    Observable<SearchPhoneListModel> getSearchGoodsOrStore(@QueryMap Map<String, String> mParams);

    /**
     * 修改用户手机号
     *
     * @param tel
     * @param code
     * @param type
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.CHANGE_USER_TEL)
    Observable<String> updateUserTel(@Field("editMobile") String tel, @Field("code") String code, @Field("type") String type);

    /**
     * 同步regID
     * @param phoneNum
     * @param regid
     * @param terminalType
     * @param terminalInfo
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.SYN_REGID)
    Observable upLoadRegID(@Field("phone_num") String phoneNum, @Field("regid") String regid,
                           @Field("terminal_type") String terminalType, @Field("terminal_info") String terminalInfo);

    /**
     * 获取积分数量
     *
     * @return
     */
    @POST(HttpTools.GET_POINT_COUNT)
    Observable<String> getPointCount(@QueryMap Map<String,String> mParams);

    /**
     * 获取短信分析链接
     *
     * @param data
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.GET_SMS_SHARE_LINK)
    Observable<String> getSMSUrl(@Field("data") String data);

    /**
     * 首页弹窗关闭监听
     *
     * @param id
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.HOME_AD_DIALOG_CLOSE)
    Observable<String> homeDialogClick(@Field("id") String id);

    /**
     * 订单操作  删除 、取消 、确认、获取列表
     * @param url
     * @param orderSn
     * @param type
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.ORDER_OPERATE)
    Observable<BaseResponse> operateOrder(@Path("type") String url,@Field("order_id") String orderSn, @Field("table_id") String type);
    /**
     * 邀请好友
     * @param sannerResult
     * @return
     */
    @FormUrlEncoded
    @POST(HttpTools.SCAN_CODE_INVITE_FRIENDS)
    Observable<BaseResponse> inviteFriedns(@Field("scan_code") String sannerResult);
    /**
     * 上传实名认证图片到通讯顾问服务器
     * @param file
     * @return
     */
    @Multipart
    @POST(HttpTools.UPLOAD_USER_HEAD_IMG)
    Call<String> upLoadImgToServer(@Part MultipartBody.Part file);


    /**
     * <>通讯顾问通用post请求方法，可以有文件参数  注意请求路径 根据路径判断是否需要加密</>
     * <>{@link SignToken#isNeedSignPath(Request)}</>
     *
     * 上传实名认证信息到face++服务器
     * @param url
     * @param mParams
     * @return
     */
    @Multipart
    @POST
    Call<String> upLoadImgToMegvii(@Url String url,@PartMap Map<String,RequestBody> mParams);

    /**
     * <>通讯顾问通用post请求方法，无文件参数  注意请求路径，此接口的入参是加过密之后的</>
     * <>{@link SignToken#isNeedSignPath(Request)}</>
     * @param url  请求路径
     * @param sign  签名
     * @param token  token
     * @param data  加密数据
     * @param version  版本号
     *                 TODO 这里不能使用泛型
     * @return
     */
    @FormUrlEncoded
    @POST
    Observable<String> txgwRequest(@Url String url,@Field("sign") String sign,
                                   @Field("token") String token,@Field("data") String data,
                                   @Field("version") String version);
}
